package cn.iocoder.yudao.module.spark.controller;

import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.spark.service.AIService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;


import java.util.Arrays;

@RestController
@RequestMapping("/ai")
public class AIController {

    @Autowired
    private AIService sparkImageService;


    @PostMapping("/competition")
    public CommonResult<Integer> recognizeCompetition(@RequestParam("file") MultipartFile file) throws Exception {
        String filename = file.getOriginalFilename();
        String ext = filename.substring(filename.lastIndexOf('.') + 1).toLowerCase();

        if (isImage(ext)) {
            // 图片识别
            String question = "识别图片内容,识别文档内容,按照下面括号内的要求填写如下文字信息：\n" +
                    "竞赛名字：识别内容\n" +
                    "比赛级别：数字\n" +
                    "主办方：识别内容\n" +
                    "获奖级别：数字\n" +
                    "参赛学生：识别内容\n" +
                    "全部指导老师：识别内容\n" +
                    "奖项：数字\n" +
                    "作品名称：识别内容或无\n" +
                    "获奖时间：yyyy-MM-ddTHH:mm:ss\n"+
                    "(1. 比赛级别：A+级别填3，A级别填2，B级别填4，C级别填6；无匹配默认填3\n" +
                    "2. 获奖级别：国家级填0，省级填1，校级填2，市级填3；无匹配默认填0\n" +
                    "3. 奖项：一等奖0，二等奖1，三等奖3，优秀奖4；无匹配默认填0\n" +
                    "4. 作品名称未识别到填\"无\"\n" +
                    "5. 时间格式：\n" +
                    "   - 月/年 → yyyy-MM-01T00:00:00\n" +
                    "   - 日/月/年 → yyyy-MM-ddT00:00:00\n" +
                    "   - 示例：2022年7月 → 2022-07-01T00:00:00)" +
                    "6. 若有多个指导老师和学生，指导老师姓名或者学生姓名之间需使用空格分割";
            return sparkImageService.recognizeCompetitionImage(file, question);
        } else if (isDoc(ext)) {
            // 文档识别
            String question = "识别文档内容,识别文档内容,按照下面括号内的要求填写如下文字信息：\n" +
                    "竞赛名字：识别内容\n" +
                    "比赛级别：数字\n" +
                    "主办方：识别内容\n" +
                    "获奖级别：数字\n" +
                    "参赛学生：识别内容\n" +
                    "全部指导老师：识别内容\n" +
                    "奖项：数字\n" +
                    "作品名称：识别内容或无\n" +
                    "获奖时间：yyyy-MM-ddTHH:mm:ss\n"+
                    "(1. 比赛级别：A+级别填3，A级别填2，B级别填4，C级别填6；无匹配默认填3\n" +
                    "2. 获奖级别：国家级填0，省级填1，校级填2，市级填3；无匹配默认填0\n" +
                    "3. 奖项：一等奖0，二等奖1，三等奖3，优秀奖4；无匹配默认填0\n" +
                    "4. 作品名称未识别到填\"无\"\n" +
                    "5. 时间格式：\n" +
                    "   - 月/年 → yyyy-MM-01T00:00:00\n" +
                    "   - 日/月/年 → yyyy-MM-ddT00:00:00\n" +
                    "   - 示例：2022年7月 → 2022-07-01T00:00:00)" +
                    "6. 若有多个指导老师和学生，指导老师姓名或者学生姓名之间需使用空格分割";
            return sparkImageService.recognizeCompetitionPdf(file, question);
        } else {
            return CommonResult.error(400, "不支持的文件类型");
        }
    }

    private boolean isImage(String ext) {
        return Arrays.asList("jpg", "jpeg", "png", "bmp", "gif", "webp").contains(ext);
    }
    private boolean isDoc(String ext) {
        return Arrays.asList("pdf", "doc", "docx", "md", "txt").contains(ext);
    }

    @PostMapping("/projects")
    public CommonResult<Integer> recognizeProjects(@RequestParam("file") MultipartFile file) throws Exception {
            String question = "识别文档内容,按照下面括号内的要求填写如下文字信息\n" +
                    "项目名称：识别内容\n" +
                    "级别：数字\n" +
                    "成员：识别内容\n" +
                    "立项时间：yyyy-MM-ddTHH:mm:ss\n"+
                    "结项时间：yyyy-MM-ddTHH:mm:ss\n"+
                    "(①级别字段国家级填4，省级填3，市级填2，校级填1;"+
                    "②成员的名字之间使用空格分割;③立项时间和结项时间字段填yyyy-MM-ddTHH:mm:ss形式，如果没有识别到日，默认日为01;" +
                    ")";
            return sparkImageService.recognizeProjects(file, question);
    }

    @PostMapping("/thesis")
    public CommonResult<Integer> recognizeThesis(@RequestParam("file") MultipartFile file) throws Exception {
        String question = "识别文档内容,严格按以下格式输出，仅包含7个字段，禁止输出任何其他文字（包括签名、背景符号、说明文字等）：\n" +
                "论文标题：识别内容\n" +
                "作者：识别内容\n" +
                "作者类型：数字\n" +
                "论文类型：数字\n"+
                "所属单位：数字\n"+
                "发表刊物/论文集：识别内容或无\n"+
                "发表时间：yyyy-MM-ddTHH:mm:ss\n"+
                "(①论文类型，期刊论文填1，会议论文填2，文章填3;"+
                "②如有多个作者，作者的名字之间使用空格分割;③发表时间字段填yyyy-MM-ddTHH:mm:ss形式，如果没有识别到日，默认日为01;" +
                "④作者类型，教师填1，学生填2;⑤所属单位，计算机学院填0，信息管理与工程学院填1，商务管理学院填2，数字媒体与设计学院填3，外国语学院填4，国际教育学院填5" +
                ")";
        return sparkImageService.recognizeThesis(file, question);
    }

    @PostMapping("/CSC")
    public CommonResult<Integer> recognizeCSC(@RequestParam("file") MultipartFile file) throws Exception {
        String question = "识别文档内容,按照下面括号内的要求填写如下文字信息\n" +
                "著作权名称：识别内容\n" +
                "编号：识别内容\n" +
                "登记号：识别内容\n" +
                "著作权类型：数字\n"+
                "出版日期：yyyy-MM-ddTHH:mm:ss\n"+
                "作者：识别内容\n"+
                "(①著作权类型，音像制品填1，软件制品填2;"+
                "②如果有多个作者，作者名字之间使用空格分割;③出版日期字段填yyyy-MM-ddTHH:mm:ss形式，如果没有识别到日，默认日为01;" +
                ")";
        return sparkImageService.recognizeCSC(file, question);

    }

}